OAuth2 Authentication একটি জনপ্রিয় অথেনটিকেশন প্রোটোকল যা ব্যবহারকারীদের নিরাপদে এবং পারমিশন প্রাপ্ত অ্যাক্সেস প্রদান করতে সহায়ক। Spring Security OAuth2 প্রটোকলটি সমর্থন করে এবং একাধিক সোশ্যাল লগইন এবং ক্লাউড ভিত্তিক অথেনটিকেশন প্রদান করার জন্য এটি একটি খুবই কার্যকরী ফ্রেমওয়ার্ক।
Spring Security তে OAuth2 Authentication কনফিগার করার জন্য, সাধারণত OAuth2 Authorization Server এবং OAuth2 Resource Server কনফিগার করতে হয়।
OAuth2 Authentication কনফিগার করার ধাপগুলো
ধাপ ১: ডিপেন্ডেন্সি যোগ করুন
pom.xml ফাইলে নিচের ডিপেন্ডেন্সি যোগ করুন:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
</dependency>
এই ডিপেন্ডেন্সিগুলি OAuth2 ক্লায়েন্ট এবং রিসোর্স সার্ভার কনফিগারেশন সহ OAuth2 সম্পর্কিত সকল কনফিগারেশন পরিচালনা করতে সহায়ক।
ধাপ ২: OAuth2 ক্লায়েন্ট কনফিগারেশন
Spring Security তে OAuth2 ক্লায়েন্ট কনফিগার করার জন্য application.yml বা application.properties ফাইলে প্রয়োজনীয় কনফিগারেশন করতে হবে।
application.yml কনফিগারেশন উদাহরণ:
spring:
security:
oauth2:
client:
registration:
google:
client-id: YOUR_GOOGLE_CLIENT_ID
client-secret: YOUR_GOOGLE_CLIENT_SECRET
scope:
- profile
- email
redirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}"
authorization-grant-type: authorization_code
client-name: Google
provider:
google:
authorization-uri: https://accounts.google.com/o/oauth2/auth
token-uri: https://oauth2.googleapis.com/token
user-info-uri: https://www.googleapis.com/oauth2/v3/userinfo
user-name-attribute: id
application.properties কনফিগারেশন উদাহরণ:
spring.security.oauth2.client.registration.google.client-id=YOUR_GOOGLE_CLIENT_ID
spring.security.oauth2.client.registration.google.client-secret=YOUR_GOOGLE_CLIENT_SECRET
spring.security.oauth2.client.registration.google.scope=profile,email
spring.security.oauth2.client.registration.google.redirect-uri={baseUrl}/login/oauth2/code/{registrationId}
spring.security.oauth2.client.registration.google.authorization-grant-type=authorization_code
spring.security.oauth2.client.registration.google.client-name=Google
spring.security.oauth2.client.provider.google.authorization-uri=https://accounts.google.com/o/oauth2/auth
spring.security.oauth2.client.provider.google.token-uri=https://oauth2.googleapis.com/token
spring.security.oauth2.client.provider.google.user-info-uri=https://www.googleapis.com/oauth2/v3/userinfo
spring.security.oauth2.client.provider.google.user-name-attribute=id
এখানে, client-id এবং client-secret গুগল ডেভেলপার কনসোলে তৈরি করা OAuth2 ক্লায়েন্ট থেকে পাবেন। এছাড়াও, আপনি যে OAuth2 প্রদানকারী (যেমন, Google, Facebook, GitHub ইত্যাদি) ব্যবহার করবেন, তার জন্য প্রাসঙ্গিক URL গুলি ব্যবহার করতে হবে।
ধাপ ৩: Spring Security কনফিগারেশন
Spring Security তে OAuth2 কনফিগার করতে HttpSecurity ব্যবহার করে লগইন, অ্যাক্সেস কন্ট্রোল ইত্যাদি কনফিগার করা হয়। এখানে ক্লায়েন্ট অ্যাপ্লিকেশন কনফিগার করা হচ্ছে।
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.oauth2.client.oauth2login.OAuth2LoginAuthenticationFilter;
import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository;
import org.springframework.security.oauth2.client.web.OAuth2LoginAuthenticationFilter;
import org.springframework.security.oauth2.client.web.OAuth2LoginAuthenticationFilter;
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/", "/home", "/public/**").permitAll()
.anyRequest().authenticated()
.and()
.oauth2Login() // OAuth2 login config
.loginPage("/login")
.authorizationEndpoint()
.baseUri("/oauth2/authorization")
.and()
.redirectionEndpoint()
.baseUri("/login/oauth2/code/*")
.and()
.tokenEndpoint()
.accessTokenResponseClient(this.accessTokenResponseClient())
.and()
.userInfoEndpoint()
.userService(this.oauth2UserService());
}
@Bean
public OAuth2LoginAuthenticationFilter oauth2LoginAuthenticationFilter(ClientRegistrationRepository clientRegistrationRepository) {
OAuth2LoginAuthenticationFilter oauth2LoginAuthenticationFilter = new OAuth2LoginAuthenticationFilter(
clientRegistrationRepository,
new DefaultOAuth2UserService()
);
oauth2LoginAuthenticationFilter.setAuthenticationManager(authenticationManager());
return oauth2LoginAuthenticationFilter;
}
}
এই কনফিগারেশনে:
oauth2Login()ব্যবহার করে OAuth2 লগইন সক্রিয় করা হয়েছে।/oauth2/authorizationএবং/login/oauth2/code/*এই দুইটি URL কনফিগার করা হয়েছে।OAuth2UserServiceব্যবহার করা হয়েছে, যা OAuth2 অথেনটিকেশন পরবর্তীতে ব্যবহারকারীর তথ্য ফেচ করতে সহায়ক।
ধাপ ৪: ইউজার তথ্য গ্রহণ করা
OAuth2 Authentication এর পর ব্যবহারকারীর তথ্য (যেমন নাম, ইমেইল) পাওয়ার জন্য OAuth2UserService কাস্টমাইজ করা যেতে পারে।
import org.springframework.security.oauth2.core.user.OAuth2User;
import org.springframework.security.oauth2.core.user.DefaultOAuth2User;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import java.util.Collections;
public class CustomOAuth2UserService implements OAuth2UserService<OAuth2UserRequest, OAuth2User> {
@Override
public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException {
OAuth2User oAuth2User = super.loadUser(userRequest);
// ব্যবহারকারীর তথ্য প্রাপ্তি এবং কাস্টমাইজেশন
String username = oAuth2User.getAttribute("name");
String email = oAuth2User.getAttribute("email");
// Return custom OAuth2 user
return new DefaultOAuth2User(
Collections.singletonList(new SimpleGrantedAuthority("ROLE_USER")),
oAuth2User.getAttributes(),
"name"
);
}
}
ধাপ ৫: OAuth2 Resource Server কনফিগারেশন
আপনি যদি একটি OAuth2 Resource Server তৈরি করতে চান (যেখানে অ্যাক্সেস টোকেনের মাধ্যমে রিসোর্স অ্যাক্সেস করা হয়), তবে নিচের কনফিগারেশনটি ব্যবহার করুন:
@Configuration
@EnableWebSecurity
public class ResourceServerConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/secure/**").authenticated()
.anyRequest().permitAll()
.and()
.oauth2ResourceServer()
.jwt(); // OAuth2 JWT ব্যবহার
return http.build();
}
}
এখানে oauth2ResourceServer().jwt() ব্যবহার করা হয়েছে, যা JWT টোকেনের মাধ্যমে অথেনটিকেশন পরিচালনা করে।
উপসংহার
Spring Security তে OAuth2 Authentication কনফিগার করা একটি শক্তিশালী এবং নিরাপদ অথেনটিকেশন ব্যবস্থা তৈরি করতে সাহায্য করে, যা ক্লায়েন্ট অ্যাপ্লিকেশনগুলোর জন্য তৃতীয় পক্ষের সেবা (যেমন, Google, Facebook) এর মাধ্যমে লগইন সুবিধা প্রদান করে। এই প্রক্রিয়ার মাধ্যমে আপনি সহজেই OAuth2 ক্লায়েন্ট এবং রিসোর্স সার্ভার কনফিগার করতে পারেন।
Read more